package com.oneday.ashop.webgate.base.ftp;

import com.jcraft.jsch.*;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.Resource;
import org.springframework.core.io.support.PropertiesLoaderUtils;
import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile;

import javax.annotation.PostConstruct;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;

/**
 * Sftp工具类
 * User:bob.yang
 * Date 2015/8/18 0018
 */
@Slf4j
@Component
public class SFtpUtil {

    /**
     *主机号
     */
    private static String host;
    /**
     * 用户名
     */
    private static String username;
    /**
     * 密码
     */
    private static String password;
    /**
     * 端口号
     */
    private static int port;
    /**
     * 图片路径
     */
    private static String imagePath;
    /**
     * 文件路径
     */
    private static String filePath;


    /**
     * 初始化静态服务器配置
     */
    @PostConstruct
    public void init() {
        Resource resource = new ClassPathResource("/application.properties");
        try {
            Properties props = PropertiesLoaderUtils.loadProperties(resource);
            host = (String)props.get("file.server.host");
            username = (String)props.get("file.server.username");
            password = (String)props.get("file.server.password");
            port = Integer.parseInt((String)props.get("file.server.port"));
            imagePath = (String)props.get("file.image.path");
            filePath = (String)props.get("file.text.path");
        } catch (IOException e) {
            log.error("初始化静态服务器配置失败！");
            e.printStackTrace();
        }
        log.info("初始化静态服务器配置完成！");
    }


    /**
     * 获得一个sftp连接
     * connect server via sftp
     */
    public static ChannelSftp connect() {
        Channel channel = null;
        try {
            JSch jsch = new JSch();
            Session sshSession = jsch.getSession(username, host, port);
            sshSession.setPassword(password);
            Properties sshConfig = new Properties();
            sshConfig.put("StrictHostKeyChecking", "no");
            sshSession.setConfig(sshConfig);
            sshSession.connect();
            channel = sshSession.openChannel("sftp");
            channel.connect();
            log.info("与静态服务器:{}连接成功!", host);
        } catch (Exception e) {
            log.error("与静态服务器:{}连接异常", host, e);

            e.printStackTrace();
        }
        return (ChannelSftp) channel;
    }

    /**
     * Disconnect with server
     */
    public static void disconnect(ChannelSftp sftp) {

        if(sftp != null){
            if(sftp.isConnected()){
                sftp.disconnect();
                log.info("与静态服务器:{}已经断开!", host);
            }else if(sftp.isClosed()){
                log.info("与静态服务器:{}已经断开!", host);
            }
        }

    }

    /**
     * 上传文件
     * @param file
     */
    public static void upload(MultipartFile file, String fileName, Integer upType) {
        ChannelSftp sftp = connect();
        try {
            if (1 == upType) {
                //上传图片路径
                sftp.cd(imagePath);
            } else {
                //上传文件路径
                sftp.cd(filePath);
            }
        } catch (SftpException e) {
            log.error("上传文件：{}到静态服务器:{}发生异常", fileName, host, e);
            e.printStackTrace();
        }
        try {
            sftp.put(file.getInputStream(), fileName);
            log.info("上传文件：{}到静态服务器:{}成功！", fileName, host);
            disconnect(sftp);
        } catch (SftpException e) {
            disconnect(sftp);
            log.error("上传文件：{}到静态服务器:{}发生异常", fileName, host, e);
            e.printStackTrace();
        } catch (IOException e) {
            disconnect(sftp);
            log.error("上传文件：{}到静态服务器:{}发生异常", fileName, host, e);
            e.printStackTrace();
        }

    }

    /**
     * 上传文件
     * @param is
     * @param fileName
     * @param upType
     */
    public static void upload(InputStream is, String fileName, Integer upType) {
        ChannelSftp sftp = connect();
        try {
            if (1 == upType) {
                //上传图片路径
                sftp.cd(imagePath);
            } else {
                //上传文件路径
                sftp.cd(filePath);
            }
        } catch (SftpException e) {
            log.error("上传文件：{}到静态服务器:{}发生异常", fileName, host, e);
            e.printStackTrace();
        }
        try {
            sftp.put(is, fileName);
            log.info("上传文件：{}到静态服务器:{}成功！", fileName, host);
            disconnect(sftp);
        } catch (SftpException e) {
            disconnect(sftp);
            log.error("上传文件：{}到静态服务器:{}发生异常", fileName, host, e);
            e.printStackTrace();
        }
    }

    /**
     * 下载
     */
    public void download() {
        // TODO Auto-generated method stub

    }

    /**
     * 下载
     * @param directory
     * @param downloadFile
     * @param saveFile
     * @param sftp
     */
    private void download(String directory, String downloadFile,String saveFile, ChannelSftp sftp) {
//        try {
//            sftp.cd(directory);
//            File file = new File(saveFile);
//            sftp.get(downloadFile, new FileOutputStream(file));
//        } catch (Exception e) {
//            e.printStackTrace();
//        }
    }

        /**
         * upload all the files to the server
         */
//        public void upload() {
//            List<String> fileList = this.getFileEntryList(fileListPath);
//            try {
//                if(fileList != null){
//                    for (String filepath : fileList) {
//                        String localFile = this.localPath + this.seperator+ filepath;
//                        File file = new File(localFile);
//
//                        if(file.isFile()){
//                            System.out.println("localFile : " + file.getAbsolutePath());
//                            String remoteFile = this.remotePath + this.seperator + filepath;
//                            System.out.println("remotePath:" + remoteFile);
//                            File rfile = new File(remoteFile);
//                            String rpath = rfile.getParent();
//                            try {
//                                createDir(rpath, sftp);
//                            } catch (Exception e) {
//                                System.out.println("*******create path failed" + rpath);
//                            }
//
//                            this.sftp.put(new FileInputStream(file), file.getName());
//                            System.out.println("=========upload down for " + localFile);
//                        }
//                    }
//                }
//            } catch (FileNotFoundException e) {
//                // TODO Auto-generated catch block
//                e.printStackTrace();
//            } catch (SftpException e) {
//                // TODO Auto-generated catch block
//                e.printStackTrace();
//            }
//
//        }
        /**
         * create Directory
         * @param filepath
         * @param sftp
         */
//        private void createDir(String filepath, ChannelSftp sftp){
//            boolean bcreated = false;
//            boolean bparent = false;
//            File file = new File(filepath);
//            String ppath = file.getParent();
//            try {
//                this.sftp.cd(ppath);
//                bparent = true;
//            } catch (SftpException e1) {
//                bparent = false;
//            }
//            try {
//                if(bparent){
//                    try {
//                        this.sftp.cd(filepath);
//                        bcreated = true;
//                    } catch (Exception e) {
//                        bcreated = false;
//                    }
//                    if(!bcreated){
//                        this.sftp.mkdir(filepath);
//                        bcreated = true;
//                    }
//                    return;
//                }else{
//                    createDir(ppath,sftp);
//                    this.sftp.cd(ppath);
//                    this.sftp.mkdir(filepath);
//                }
//            } catch (SftpException e) {
//                System.out.println("mkdir failed :" + filepath);
//                e.printStackTrace();
//            }
//
//            try {
//                this.sftp.cd(filepath);
//            } catch (SftpException e) {
//                e.printStackTrace();
//                System.out.println("can not cd into :" + filepath);
//            }
//
//        }
//        /**
//         * get all the files need to be upload or download
//         * @param file
//         * @return
//         */
//        private List<String> getFileEntryList(String file){
//            ArrayList<String> fileList = new ArrayList<String>();
//            InputStream in = null;
//            try {
//
//                in = new FileInputStream(file);
//                InputStreamReader inreader = new InputStreamReader(in);
//
//                LineNumberReader linreader = new LineNumberReader(inreader);
//                String filepath = linreader.readLine();
//                while(filepath != null){
//                    fileList.add(filepath);
//                    filepath = linreader.readLine();
//                }
//                in.close();
//            } catch (FileNotFoundException e) {
//                // TODO Auto-generated catch block
//                e.printStackTrace();
//            } catch (IOException e) {
//                // TODO Auto-generated catch block
//                e.printStackTrace();
//            }finally{
//                if(in != null){
//                    in = null;
//                }
//            }
//
//            return fileList;
//        }
//
//        /**
//         * @return the host
//         */
//        public String getHost() {
//            return host;
//        }
//
//        /**
//         * @param host the host to set
//         */
//        public void setHost(String host) {
//            this.host = host;
//        }
//
//        /**
//         * @return the username
//         */
//        public String getUsername() {
//            return username;
//        }
//
//        /**
//         * @param username the username to set
//         */
//        public void setUsername(String username) {
//            this.username = username;
//        }
//
//        /**
//         * @return the password
//         */
//        public String getPassword() {
//            return password;
//        }
//
//        /**
//         * @param password the password to set
//         */
//        public void setPassword(String password) {
//            this.password = password;
//        }
//
//        /**
//         * @return the port
//         */
//        public int getPort() {
//            return port;
//        }
//
//        /**
//         * @param port the port to set
//         */
//        public void setPort(int port) {
//            this.port = port;
//        }
//
//        /**
//         * @return the sftp
//         */
//        public ChannelSftp getSftp() {
//            return sftp;
//        }
//
//        /**
//         * @param sftp the sftp to set
//         */
//        public void setSftp(ChannelSftp sftp) {
//            this.sftp = sftp;
//        }
//
//        /**
//         * @return the localPath
//         */
//        public String getLocalPath() {
//            return localPath;
//        }
//
//        /**
//         * @param localPath the localPath to set
//         */
//        public void setLocalPath(String localPath) {
//            this.localPath = localPath;
//        }
//
//        /**
//         * @return the remotePath
//         */
//        public String getRemotePath() {
//            return remotePath;
//        }
//
//        /**
//         * @param remotePath the remotePath to set
//         */
//        public void setRemotePath(String remotePath) {
//            this.remotePath = remotePath;
//        }
//
//        /**
//         * @return the fileListPath
//         */
//        public String getFileListPath() {
//            return fileListPath;
//        }
//
//        /**
//         * @param fileListPath the fileListPath to set
//         */
//        public void setFileListPath(String fileListPath) {
//            this.fileListPath = fileListPath;
//        }
//
//        public static void main(String[] args) {
//            // TODO Auto-generated method stub
//            SFTPUtil ftp= new SFTPUtil();
//            ftp.connect();
//            ftp.upload();
//            ftp.disconnect();
//            System.exit(0);
//        }
//
//



}
